package com.shioirikukuri.redis;

import lombok.Getter;

import java.util.concurrent.TimeUnit;

/**
 * CommonRedisKey 枚举用于定义常见的 Redis 键模式。
 * 每个枚举实例代表一个特定类型的键，并且包含了：
 * - 一个用于构建完整 Redis 键名的前缀；
 * - 设置键的过期时间单位；
 * - 设置键的具体过期时间长度。
 */
@Getter
public enum CommonRedisKey {
    /**
     * 用户令牌的 Redis 键配置。
     * 它的前缀是 "userToken:"，表示所有用户的令牌都会以此为开头。
     * 设置的过期时间为 30 分钟，这意味着如果一个用户在这段时间内没有活动，
     * 则其令牌将自动从 Redis 中移除。
     */
    USER_TOKEN("userToken:", TimeUnit.MINUTES, 30);

    /**
     * 构造函数初始化每个枚举常量的属性。
     *
     * @param prefix     Redis 键的前缀部分，用于标识键的类型。
     * @param unit       过期时间的时间单位。
     * @param expireTime 键的过期时间长度。
     */
    CommonRedisKey(String prefix, TimeUnit unit, int expireTime) {
        this.prefix = prefix;
        this.unit = unit;
        this.expireTime = expireTime;
    }

    /**
     * 获取带有给定唯一标识符的实际 Redis 键。
     *
     * @param key 唯一标识符，例如用户 ID 或者其他能够唯一确定对象的标识。
     * @return 返回完整的 Redis 键字符串。
     */
    public String getRealKey(String key) {
        return this.prefix + key;
    }

    /** Redis 键的前缀。 */
    private final String prefix;

    /** 过期时间的时间单位。 */
    private final TimeUnit unit;

    /** 键的过期时间长度。 */
    private final int expireTime;
}
